/*
 * @Author: FANQIELAN
 * @Date: 2024-11-20 16:39:54
 * @LastEditors: FANQIELAN
 * @LastEditTime: 2024-11-22 17:48:13
 * @FilePath: \embedded-learning\Cpp\src\Cpp_SeqList.cpp
 * @Description: 
 * 
 * Copyright (c) 2024 by FANQIELAN, All Rights Reserved. 
 */

#include "../include/Cpp_SeqList.h"

/** 
 * @description: 顺序表初始化，讲数据清空并将长度设置为0。
 * @param {SeqList} &L - 顺序表的地址，通过指针传递以修改原顺序表。
 * @return {void} 无返回值。
 */
void InitList(SeqList &L)
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        L.data[i] = 0;
    }
    L.length = 0;
}

/**
 * @description: 初始化顺序表，用malloc动态分配数据空间。
 *               设置表长为0，最大元素量为 INITSIZE。
 * @param {SeqList} &L - 顺序表的地址，用指针传递以修改原顺序表。
 * @return {void} 无返回值。
 */
void InitList_Malloc(SeqList_Malloc &L)
{
    // 用malloc函数申请一片连续的存储空间
    L.data=(int *)malloc(INIT_SIZE*sizeof(int));
    L.length=0;
    L.MaxSize=INIT_SIZE;
}

/**
 * @description: 扩展顺序表的大小并修改最大元素量。
 *               通过重新分配内存，在顺序表末尾添加空间。
 * @param {SeqList} &L - 顺序表的地址
 * @param {int} len 要增加的空间长度
 * @return {void} 无返回值。
 */
void IncreaseSize_Malloc(SeqList_Malloc &L, int len)
{
    int *p=L.data;

    // 重新分配空间
    L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
    if (L.data == NULL){
        // 错误处理:内存分配失败
        printf("Memory allocation failed!\n");
    }

    // 复制原有数据到新空间
    for(int i=0; i<L.length; i++){
        L.data[i]=0;    // 保留原有数据
    }

    // 更新最大元素量
    L.MaxSize+=len;

    // 释放原数据的内存
    free(p);
}
